-
Notifications
You must be signed in to change notification settings - Fork 106
Add /jira:backlog command to find suitable tickets from backlog #119
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add /jira:backlog command to find suitable tickets from backlog #119
Conversation
|
/retest |
Regenerate PLUGINS.md and docs/data.json to include the new jira:backlog command in the plugin documentation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
|
Forgive the messy commits - the branch was made when the PLUGINS.md test wasn't introduced. |
|
/assign |
WalkthroughDocuments a new Jira backlog discovery command with project-key and optional assignee/inactivity filters. Adds command entries to PLUGINS.md and docs/data.json, then provides comprehensive implementation documentation detailing credential handling, JQL construction, ticket filtering, and multi-priority analysis logic. Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes
Pre-merge checks and finishing touchesImportant Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (1 inconclusive)
✅ Passed checks (6 passed)
✨ Finishing touches🧪 Generate unit tests (beta)
📜 Recent review detailsConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Cache: Disabled due to data retention organization setting Knowledge base: Disabled due to data retention organization setting 📒 Files selected for processing (2)
🚧 Files skipped from review as they are similar to previous changes (1)
🔇 Additional comments (1)
Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 5
🧹 Nitpick comments (1)
plugins/jira/commands/backlog.md (1)
384-384: Replace over-used intensifier "very" with more precise language.Lines 384 and 529 use "very old" and "very large" respectively (EN_WEAK_ADJECTIVE linting flag).
Apply these diffs for more precise language:
- Zero comments AND very old (120+ days) - likely abandoned + Zero comments AND aged 120+ days - likely abandoned - **Parallel-safe:** Can process very large backlogs (10,000+ tickets) without issues + **Parallel-safe:** Can process large backlogs (10,000+ tickets) without issuesAlso applies to: 529-529
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
Cache: Disabled due to data retention organization setting
Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting
📒 Files selected for processing (3)
PLUGINS.md(1 hunks)docs/data.json(1 hunks)plugins/jira/commands/backlog.md(1 hunks)
🧰 Additional context used
🪛 Gitleaks (8.28.0)
plugins/jira/commands/backlog.md
[high] 511-511: Discovered a potential authorization token provided in a curl command header, which could compromise the curl accessed resource.
(curl-auth-header)
🪛 LanguageTool
plugins/jira/commands/backlog.md
[style] ~384-~384: As an alternative to the over-used intensifier ‘very’, consider replacing this phrase.
Context: ...lready complete) - Zero comments AND very old (120+ days) - likely abandoned - Com...
(EN_WEAK_ADJECTIVE)
[style] ~529-~529: As an alternative to the over-used intensifier ‘very’, consider replacing this phrase.
Context: ...limits - Parallel-safe: Can process very large backlogs (10,000+ tickets) without issu...
(EN_WEAK_ADJECTIVE)
🪛 markdownlint-cli2 (0.18.1)
plugins/jira/commands/backlog.md
10-10: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
80-80: Bare URL used
(MD034, no-bare-urls)
81-81: Bare URL used
(MD034, no-bare-urls)
141-141: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
172-172: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
233-233: Code block style
Expected: fenced; Actual: indented
(MD046, code-block-style)
267-267: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
342-342: Unordered list indentation
Expected: 0; Actual: 3
(MD007, ul-indent)
343-343: Unordered list indentation
Expected: 0; Actual: 3
(MD007, ul-indent)
413-413: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
483-483: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
493-493: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
504-504: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🔇 Additional comments (10)
PLUGINS.md (1)
98-98: LGTM—command entry correctly placed and formatted.The new
/jira:backlogcommand entry follows the same format as other Jira commands and is positioned before/jira:createas expected. The command syntax and description are clear.docs/data.json (1)
76-81: LGTM—metadata entry is valid and consistent.The JSON structure is well-formed and values align with the PLUGINS.md entry. The command is correctly positioned before
createin the Jira plugin's command array. Bothsynopsisandargument_hintmatch the documented syntax.plugins/jira/commands/backlog.md (8)
1-12: LGTM—frontmatter and synopsis are well-structured.The YAML frontmatter, command name, and synopsis sections are correctly formatted and match the entries in PLUGINS.md and docs/data.json.
14-35: LGTM—description clearly explains command purpose and differentiates from simple filtering.The description effectively communicates that this command performs intelligent analysis rather than simple filtering, which is an important distinction. The key features section and use cases are well-articulated.
36-152: LGTM—prerequisites and MCP configuration section is thorough and actionable.The prerequisites are comprehensive, with clear explanations of:
- Why direct curl is used instead of MCP (avoiding 413 errors and token limits)
- Required configuration file format with all necessary fields
- Field descriptions with links to token generation pages
- Container setup with
podmanincluding commands for managing the container- Verification steps with helpful error diagnostics
This level of detail will help users set up the command correctly.
153-267: LGTM—implementation workflow is detailed and logical.The step-by-step implementation section clearly outlines:
- Credential extraction from MCP config (steps 1–2)
- Argument parsing and validation (step 2)
- JQL query construction with proper filtering (step 3)
- Batched ticket retrieval with pagination and error handling (step 4)
- The batch processing loop correctly implements pagination with proper status tracking
The explanation for why curl is used instead of MCP is justified and well-documented.
275-349: LGTM—Python filtering logic and batch processing strategy is sound.The Python processing script correctly:
- Loads all batch files using glob patterns
- Filters for available tickets (unassigned or bot-assigned)
- Groups by normalized priority levels
- Handles priority name variations (Critical/Blocker, High/Major, Normal/Medium, Low/Minor/Trivial)
- Saves both filtered results and statistics
This approach ensures clean data for the subsequent analysis phase.
350-409: LGTM—intelligent ticket analysis strategy emphasizes human judgment over mechanical selection.The analysis approach is well-conceived with:
- Clear distinction that this is NOT automated selection (critical emphasis on line 352)
- Structured classification of ticket age (Very Fresh through Very Old)
- Disqualifying factors that prevent invalid recommendations
- Positive indicators for suitable tickets
- Selection criteria ranked by importance (recency > clarity > impact > activity)
- Requirement to document reasoning for each selection
This prevents the risk of recommending inappropriate tickets and ensures the command serves as a true assistant rather than just automation.
410-480: LGTM—output format and error handling are comprehensive.The report format includes:
- Search criteria summary for reproducibility
- Organization by priority with count for each level
- Per-ticket details including status, updates, reporter, components, labels
- Context summary, recent activity, and recommendations
- Next steps guiding users to related commands (
/jira:grooming,/jira:solve)Error handling covers all major failure modes:
- Missing credentials file
- Incomplete credentials
- Authentication failures with recovery steps
- Invalid project keys
- No tickets found with suggestions for adjustment
- curl and jq failures
- Rate limiting with backoff strategy
534-584: LGTM—examples, arguments section, and return values are clear and complete.The examples demonstrate:
- Basic usage (OCPBUGS project)
- Custom inactivity threshold
- User-specific filtering
- Usage across different projects
- Real performance metrics from testing (2,535 tickets, no 413 errors)
The arguments section documents:
- Required
project-keywith format requirements (uppercase, optional hyphens)- Optional
--assigneefilter with defaults- Optional
--days-inactivethreshold with sensible defaultsReturn values clearly list all outputs including intermediate files, optional final report, and statistics.
| jira:backlog | ||
|
|
||
| ## Synopsis | ||
| ``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add language specifiers to all fenced code blocks for markdown compliance.
Multiple code blocks lack language identifiers (MD040). This affects syntax highlighting and linting compliance.
Apply these diffs to specify languages:
- ```
+ ```bashFor Python blocks (around lines 283–339):
- ```python
+ ```pythonFor JSON blocks (around lines 60–75, 329–335, 538–542):
- ```
+ ```jsonFor JQL blocks (around lines 189–198):
- ```jql
+ ```jqlAll code blocks should follow the format:
```language
code here
```Also applies to: 141-141, 172-172, 267-267, 413-413, 483-483, 493-493, 504-504
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)
10-10: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
In plugins/jira/commands/backlog.md around lines 10, 60–75, 141, 172, 189–198,
267, 283–339, 329–335, 413, 483, 493, 504, and 538–542: several fenced code
blocks are missing language specifiers (MD040). Edit each triple-backtick fence
to include the appropriate language identifier — e.g., ```bash for shell
examples at line 10 and others, ```python for the Python blocks around 283–339,
```json for JSON blocks at 60–75, 329–335 and 538–542, and ```jql for the JQL
block at 189–198 — and update the remaining listed lines (141, 172, 267, 413,
483, 493, 504) to include their correct language tags so all fenced code blocks
include a language identifier.
| - `JIRA_API_TOKEN`: Atlassian API token from https://id.atlassian.com/manage-profile/security/api-tokens | ||
| - `JIRA_PERSONAL_TOKEN`: Red Hat JIRA Personal Access Token from https://issues.redhat.com/secure/ViewProfile.jspa?selectedTab=com.atlassian.pats.pats-plugin:jira-user-personal-access-tokens |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wrap bare URLs in markdown syntax to comply with linting standards.
Lines 80–81 contain bare URLs that should be wrapped in angle brackets or markdown link syntax to pass linting checks.
Apply this diff:
- `JIRA_API_TOKEN`: Atlassian API token from https://id.atlassian.com/manage-profile/security/api-tokens
- `JIRA_PERSONAL_TOKEN`: Red Hat JIRA Personal Access Token from https://issues.redhat.com/secure/ViewProfile.jspa?selectedTab=com.atlassian.pats.pats-plugin:jira-user-personal-access-tokens
+ `JIRA_API_TOKEN`: Atlassian API token from <https://id.atlassian.com/manage-profile/security/api-tokens>
+ `JIRA_PERSONAL_TOKEN`: Red Hat JIRA Personal Access Token from <https://issues.redhat.com/secure/ViewProfile.jspa?selectedTab=com.atlassian.pats.pats-plugin:jira-user-personal-access-tokens>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - `JIRA_API_TOKEN`: Atlassian API token from https://id.atlassian.com/manage-profile/security/api-tokens | |
| - `JIRA_PERSONAL_TOKEN`: Red Hat JIRA Personal Access Token from https://issues.redhat.com/secure/ViewProfile.jspa?selectedTab=com.atlassian.pats.pats-plugin:jira-user-personal-access-tokens | |
| - `JIRA_API_TOKEN`: Atlassian API token from <https://id.atlassian.com/manage-profile/security/api-tokens> | |
| - `JIRA_PERSONAL_TOKEN`: Red Hat JIRA Personal Access Token from <https://issues.redhat.com/secure/ViewProfile.jspa?selectedTab=com.atlassian.pats.pats-plugin:jira-user-personal-access-tokens> |
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)
80-80: Bare URL used
(MD034, no-bare-urls)
81-81: Bare URL used
(MD034, no-bare-urls)
🤖 Prompt for AI Agents
In plugins/jira/commands/backlog.md around lines 80 to 81, the two bare URLs
must be wrapped in markdown link syntax or angle brackets to satisfy linting:
replace the plain URLs with either
<https://id.atlassian.com/manage-profile/security/api-tokens> and
<https://issues.redhat.com/secure/ViewProfile.jspa?selectedTab=com.atlassian.pats.pats-plugin:jira-user-personal-access-tokens>
or convert them to descriptive links like [Atlassian API
token](https://id.atlassian.com/manage-profile/security/api-tokens) and [Red Hat
JIRA Personal Access
Token](https://issues.redhat.com/secure/ViewProfile.jspa?selectedTab=com.atlassian.pats.pats-plugin:jira-user-personal-access-tokens).
| maxResults=1000&\ | ||
| fields=summary,status,priority,assignee,reporter,created,updated,description,labels,components,watches,comment" | ||
| # Fetch batch using curl with Bearer token authentication |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use fenced code blocks with language specifier instead of indented blocks.
Line 233 uses indented code block format. The markdown linter (MD046) requires fenced blocks with language specification.
Convert to fenced block:
- **Batch Processing Loop:**
- ```bash
+ **Batch Processing Loop:**
+
+ ```bashThis applies to the indented code example around line 233 that should be converted to a fenced block with bash language identifier.
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)
233-233: Code block style
Expected: fenced; Actual: indented
(MD046, code-block-style)
🤖 Prompt for AI Agents
In plugins/jira/commands/backlog.md around line 233 the example uses an indented
code block; update it to a fenced code block with a language specifier by
replacing the indented block with a triple-backtick fence and the language tag
"bash" (```bash) before the snippet and a closing triple-backtick after, and
ensure any preceding/contextual bullets like "Batch Processing Loop" remain
plain text above the fenced block.
| - `.work/jira-backlog/{project-key}/filtered.json` - All filtered tickets grouped by priority | ||
| - `.work/jira-backlog/{project-key}/stats.json` - Priority distribution statistics |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix list indentation to comply with MD007 linting rule.
Lines 342–343 have incorrect indentation for unordered list items (expected 0, actual 3).
Apply this diff to fix indentation:
- **Outputs:**
- - `.work/jira-backlog/{project-key}/filtered.json` - All filtered tickets grouped by priority
- - `.work/jira-backlog/{project-key}/stats.json` - Priority distribution statistics
+ **Outputs:**
+
+ - `.work/jira-backlog/{project-key}/filtered.json` - All filtered tickets grouped by priority
+ - `.work/jira-backlog/{project-key}/stats.json` - Priority distribution statistics📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - `.work/jira-backlog/{project-key}/filtered.json` - All filtered tickets grouped by priority | |
| - `.work/jira-backlog/{project-key}/stats.json` - Priority distribution statistics | |
| **Outputs:** | |
| - `.work/jira-backlog/{project-key}/filtered.json` - All filtered tickets grouped by priority | |
| - `.work/jira-backlog/{project-key}/stats.json` - Priority distribution statistics |
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)
342-342: Unordered list indentation
Expected: 0; Actual: 3
(MD007, ul-indent)
343-343: Unordered list indentation
Expected: 0; Actual: 3
(MD007, ul-indent)
🤖 Prompt for AI Agents
In plugins/jira/commands/backlog.md around lines 342 to 343, the unordered list
items are indented with 3 spaces which violates MD007 (expect 0); remove the
leading spaces so each list item starts at column 0 (no leading spaces) and keep
the dash, space, and text intact so the two lines become top-level list entries.
| 1. Check that JIRA_PERSONAL_TOKEN is correct and not expired | ||
| 2. Verify JIRA_USERNAME matches your JIRA account | ||
| 3. Ensure JIRA_URL is correct (e.g., https://issues.redhat.com) | ||
| 4. Test authentication: curl -H "Authorization: Bearer YOUR_TOKEN" YOUR_JIRA_URL/rest/api/2/myself |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remove or anonymize the curl authentication header example to avoid potential security issues.
The curl command on line 511 (in the error handling section) shows an Authorization: Bearer header pattern. While this is a documentation example with placeholder text, the gitleaks tool flags this as a potential token exposure risk.
Apply this diff to address the security linting concern:
- 4. Test authentication: curl -H "Authorization: Bearer YOUR_TOKEN" YOUR_JIRA_URL/rest/api/2/myself
+ 4. Test authentication: `curl -u username:token https://YOUR_JIRA_URL/rest/api/2/myself` (or use Bearer token in header)Alternatively, move the example to a code block and clearly mark it as pseudocode:
- Test authentication: curl -H "Authorization: Bearer YOUR_TOKEN" YOUR_JIRA_URL/rest/api/2/myself
+ Test authentication with Bearer token (replace placeholders):
+ ```bash
+ curl -H "Authorization: Bearer <YOUR_JIRA_PERSONAL_TOKEN>" \
+ https://<YOUR_JIRA_URL>/rest/api/2/myself
+ ```This keeps the documentation useful while addressing the security scan concern by using proper code block formatting and clearer placeholder notation.
🧰 Tools
🪛 Gitleaks (8.28.0)
[high] 511-511: Discovered a potential authorization token provided in a curl command header, which could compromise the curl accessed resource.
(curl-auth-header)
🤖 Prompt for AI Agents
In plugins/jira/commands/backlog.md around line 511, the example curl command
exposes an Authorization: Bearer pattern that triggers security scanners;
replace the inline example with a clearly anonymized code-block example using a
placeholder token and URL (e.g., Authorization: Bearer
<YOUR_JIRA_PERSONAL_TOKEN> and https://<YOUR_JIRA_URL>/rest/api/2/myself) or
remove the header entirely so the documentation no longer contains a raw bearer
pattern; ensure the example is wrapped in a fenced code block and labeled as
pseudocode/bash.
- Sort plugins alphabetically - Implement autocomplete dropdown showing plugins, commands, and skills - Add README button to plugin modal headers - Filter and display search results in organized sections - Support keyboard and click-outside handlers for autocomplete
Bootstrap an initial set of ethical guidelines. The first focused on establishing clear guidance around referencing people. Additional may be added as needs are identified. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
Add comprehensive OVN Northbound database analysis for interconnect mode clusters using ovsdb-tool to query binary database files. Assisted-by: Claude <[email protected]> Signed-off-by: Patryk Diak <[email protected]>
This command automates creating PRs to add wait steps to OpenShift CI workflows, enabling QE to debug test failures by pausing execution and allowing SSH access to the test environment. Key features: - Prioritizes job config modifications over workflow modifications - Uses OCP version to search correct job config files (e.g., release-4.21) - Adds wait step before last test step (allowing setup steps to complete) - Auto-commits and auto-pushes changes - Minimal user prompts (only initial inputs + multi-file selection) - Clear impact warnings (job config vs workflow scope) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
Add new command to automatically generate bug fix release notes by analyzing Jira bugs and their linked GitHub PRs. The command extracts Cause and Consequence from the bug description, analyzes PR content, and updates the Jira ticket with a synthesized release note. This automation saves time and ensures consistent release note quality across all bugs by analyzing multiple sources: PR descriptions, commit messages, code changes, and PR comments. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
Add detailed implementation skill providing step-by-step guidance for generating release notes. The skill covers: - Parsing bug descriptions for Cause/Consequence - Extracting and analyzing GitHub PRs - Synthesizing information into cohesive release notes - Security validation and error handling This skill ensures consistent, high-quality implementation of the create-release-note command. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
Add documentation for the new create-release-note command to the Jira plugin README. Includes usage examples, prerequisites, and sample output. This helps users understand how to use the new release note generation feature. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
Update PLUGINS.md and docs/data.json to reflect the new create-release-note command. Generated files are kept in sync with plugin metadata to ensure accurate documentation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
Address feedback from @stbenjam to improve GitHub PR discovery logic: - Add explicit warnings against using `gh issue view` with Jira keys - Prioritize searching Jira remote links first (primary source) - Add fallback search using `gh pr list --search` for common repos - Provide user confirmation workflow for found PRs - Update both command and skill documentation with clear examples This prevents the error where the command tried to use Jira keys as GitHub issue numbers, which fails because they are different identifiers. Fixes: openshift-eng#99 (comment) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
Add optional timeout parameter (1h-72h) to customize wait duration in CI debugging jobs. Defaults to 3h when omitted. Implementation includes: - Fixed Python section boundary detection for test: section - Timeout normalized to Go duration format (e.g., "8h" → "8h0m0s") - Added best_effort: true when timeout is customized
Regenerate PLUGINS.md and docs/data.json to include the new jira:backlog command in the plugin documentation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: ehearne-redhat The full list of commands accepted by this bot can be found here.
Needs approval from an approver in each of these files:
Approvers can indicate their approval by writing |
Update PLUGINS.md and docs/data.json to reflect the new create-release-note command. Generated files are kept in sync with plugin metadata to ensure accurate documentation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
Regenerate PLUGINS.md and docs/data.json to include the new jira:backlog command in the plugin documentation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
Update PLUGINS.md and docs/data.json to reflect the new create-release-note command. Generated files are kept in sync with plugin metadata to ensure accurate documentation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
Regenerate PLUGINS.md and docs/data.json to include the new jira:backlog command in the plugin documentation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 6
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
plugins/must-gather/README.md (1)
345-345: Update outdated command example to current syntax.Line 345 contains an outdated example using
/analyze-mgcommand. This should be updated to the current/must-gather:analyzecommand syntax.Apply this diff:
### Complete Cluster Analysis -\`\`\` -/analyze-mg ./must-gather.local.5464029130631179436 -\`\`\` +\`\`\` +/must-gather:analyze ./must-gather.local.5464029130631179436 +\`\`\`
🧹 Nitpick comments (22)
plugins/openshift/commands/create-cluster.md (3)
350-359: Recommend secure file permissions for GCP service account key.The service account key file created on line 355 should have restrictive permissions to prevent unauthorized access. Consider adding explicit permission management in the documentation or script.
Add a note or explicit permission-setting step after key creation:
echo "Creating service account key..." gcloud iam service-accounts keys create "$KEY_FILE" \ --iam-account="$SERVICE_ACCOUNT_EMAIL" + chmod 600 "$KEY_FILE" echo "Service account key saved to: $KEY_FILE"Additionally, consider adding a security note in the documentation: "The key file contains sensitive credentials. Ensure the file has restricted permissions (readable only by the user) and never commit it to version control."
297-301: Add validation for Kerberos ID input.Line 299 states "Validate it's not empty" but the validation logic is not shown in the implementation. Provide concrete validation code.
Add explicit validation after prompting for Kerberos ID:
2. **Prompt for Kerberos ID**: - Ask: "Please provide your Kerberos ID (e.g., jsmith):" - Store as `$KERBEROS_ID` - - Validate it's not empty + - Validate it's not empty: + ```bash + while [ -z "$KERBEROS_ID" ]; do + echo "Error: Kerberos ID cannot be empty." + read -p "Please provide your Kerberos ID (e.g., jsmith): " KERBEROS_ID + done + ```
264-280: Ensure clear separation and context for GCP service account options.The two options (existing vs. new service account) are presented well, but the documentation could more clearly state which option is recommended for first-time users and provide early validation of prerequisites.
Consider adding introductory guidance:
If the platform is GCP, the installer requires a service account JSON file with appropriate permissions. Present the user with two options: 1. **Use an existing service account JSON file** 2. **Create a new service account** **Ask the user**: "Do you want to use an existing service account JSON file or create a new one?" + + **Recommendation**: If you already have a GCP service account configured with the necessary permissions, select option 1. Otherwise, select option 2 and ensure you have the `gcloud` CLI installed and are authenticated to your GCP project.This guides users toward the correct choice without adding complexity.
plugins/openshift/commands/expand-test-case.md (1)
10-12: Specify language for fenced code block.Line 10 opens a fenced code block without a language identifier. This aids syntax highlighting and follows markdown best practices.
## Synopsis -``` +```bash /openshift:expand-test-case [test-idea-or-file-or-commands] [format] -``` +```plugins/openshift/commands/cluster-health-check.md (2)
10-12: Specify language for fenced code blocks.Several code blocks lack language identifiers. Add
bash,json, or appropriate language to aid readability and syntax highlighting (lines 10, 422, 427, 455, 460).Example fix for line 10:
## Synopsis -``` +```bash /openshift:cluster-health-check [--verbose] [--output-format json|text] -``` +```
538-538: Remove redundant phrase.Line 538 contains the redundant phrase "point in time." Consider using simply "The command checks cluster state at a given time" or "The command checks cluster state; transient issues may not be detected."
plugins/openshift/commands/review-test-cases.md (1)
10-12: Specify language for fenced code block.Line 10 opens a fenced code block without a language identifier.
## Synopsis -``` +```bash /openshift:review-test-cases [file-path-or-test-code-or-commands] -``` +```.coderabbit.yaml (1)
47-80: Consider graduated enforcement for Git Push Safety Rules.The git push safety rules are critical (no pushes to main/master, no force pushes), but the "ask before any push" requirement may be overly strict for feature branch workflows. Consider whether
warningmode might be more suitable for user confirmation reminders, reservingerrorfor the more critical main/master and force-push restrictions.plugins/jira/README.md (2)
204-210: Specify language for code block showing release note format.The code block at line 204 lacks a language identifier. Use a language hint (could be
textor a markup language if appropriate) for consistency.**Release Note Format:** -``` +```text Cause: <extracted from bug description>
219-233: Specify language for example output code block.The code block at line 219 should include a language identifier. Since this is example output/text, use
textorbash:**Example Output:** -``` +```text ✓ Release Note Created for OCPBUGS-38358plugins/ci/commands/query-test-result.md (2)
10-10: Specify language for all fenced code blocks to improve markdown compliance.Multiple code blocks lack language specifiers. Use
bashfor shell commands,pythonfor Python, andjsonfor JSON examples. This improves readability and enables syntax highlighting.Example fixes:
- Line 10:
\``→```bash`- Line 42-54: Already has
\``python` ✓- Line 56-60: Missing specifier, should be
\``json`- Lines 139-146, 154-186, 191-227: Should be
\``(no output language) ortext`Also applies to: 42-42, 56-56, 73-73, 139-139, 154-154, 161-161, 168-168, 175-175, 182-182, 191-191
245-247: Wrap bare URLs as markdown links in "See Also" section.Bare URLs should be wrapped as markdown links per MD034 rule. Lines 245-247 contain unlinked URLs.
Apply this diff to fix:
## See Also -- Sippy UI (Production): https://sippy.dptools.openshift.org/sippy-ng/ -- Sippy UI (QE): https://qe-component-readiness.dptools.openshift.org -- Sippy API Documentation: https://github.com/openshift/sippy +- [Sippy UI (Production)](https://sippy.dptools.openshift.org/sippy-ng/) +- [Sippy UI (QE)](https://qe-component-readiness.dptools.openshift.org) +- [Sippy API Documentation](https://github.com/openshift/sippy)plugins/must-gather/commands/analyze.md (1)
82-82: Specify language for bash code block.Line 82 contains a fenced code block without a language specifier. Should be
\``bash`.Apply this diff:
**Script Availability Check:** Before running any analysis, first verify: -\`\`\`bash +\`\`\`bash ls plugins/must-gather/skills/must-gather-analyzer/scripts/analyze_clusteroperators.py \`\`\`plugins/ci/commands/list-unstable-tests.md (1)
31-31: Specify language for all fenced code blocks to improve markdown compliance.Multiple code blocks lack language specifiers throughout the file. Use
bashfor shell commands andpythonorjsonfor data formats.Example fixes:
- Line 31, 42, 48, 56, 73: Should be
\``pythonor```json` depending on content- Line 114, 121, 126, 135: Should be
\``` (plain text) or appropriate language- Line 153, 171: Should be
\``ortext`Also applies to: 42-42, 48-48, 56-56, 73-73, 114-114, 121-121, 126-126, 135-135, 153-153, 171-171
plugins/jira/skills/create-release-note/SKILL.md (1)
31-31: Specify language for all fenced code blocks throughout the file.This large documentation file contains numerous code blocks without language specifiers. Apply language identifiers for consistency and syntax highlighting. Use:
bashfor shell commandsjsonfor JSON examplespythonfor Python code snippets- Leave blank for plain text/terminal output if needed
This applies to approximately 30 code blocks throughout the file. Most significantly impact readability in the implementation steps and examples sections.
Also applies to: 56-56, 73-73, 126-126, 135-135, 153-153, 171-171, 209-209, 234-234, 250-250, 382-382, 393-393, 403-403, 421-421, 433-433, 444-444, 457-457, 473-473, 532-532, 588-588, 621-621, 638-638, 652-652, 661-661, 671-671, 689-689, 708-708, 740-740, 765-765
plugins/ci/commands/add-debug-wait.md (4)
608-608: Use heading syntax instead of bold emphasis for error sections.Lines 608, 618, 628, 641, and 648 use bold text (emphasis) for section headers, but should use markdown headings. This violates MD036 rule and reduces document structure clarity.
Apply this diff to fix:
-### Step 7: Push and Show GitHub Link +### Step 7: Push and Show GitHub Link -**Error: Repository Not Found** +### Error: Repository Not Found -**Error: Not in openshift/release Repo** +### Error: Not in openshift/release Repo -**Error: Workflow File Not Found** +### Error: Workflow File Not Found -**Error: Wait Step Already Exists** +### Error: Wait Step Already Exists -**Error: Invalid OCP Version** +### Error: Invalid OCP Version -### Error: Invalid Timeout Format +### Error: Invalid Timeout FormatAlso applies to: 618-618, 628-628, 641-641, 648-648
305-305: Use hyphenated adjective "user-provided".Lines 305 and 342 use "user provided" as an adjective modifying "timeout parameter". This should be hyphenated as "user-provided" per English grammar rules.
Apply this diff:
-2. **With custom timeout** (user provided timeout parameter): +2. **With custom timeout** (user-provided timeout parameter):Also applies to: 342-342
409-496: Specify language identifier for Python code blocks.Lines 409-496 and 510-581 contain Python function definitions that should be marked with the
pythonlanguage identifier for proper syntax highlighting.Apply this diff:
-\`\`\` +\`\`\`python def add_wait_step_to_job_config(file_path, job_name, timeout=None): """ Add '- ref: wait' before the last step in the job's test: sectionAlso applies to: 510-581
10-12: Add language specifiers to remaining code blocks.Many code blocks throughout the file lack language specifiers (MD040 violations). Lines 10, 36-41, 43-54, 55-81, 104-127, and others should specify bash, yaml, json, or text as appropriate.
Also applies to: 36-41, 43-54, 55-81, 104-127, 128-186, 187-209
plugins/must-gather/commands/ovn-dbs.md (1)
10-10: Specify language for all fenced code blocks.Multiple code blocks throughout the file lack language specifiers (MD040 violations). Use
bashfor shell commands,yamlfor YAML output, andjsonfor JSON queries.Examples:
- Line 10, 133, 139, 145, 151, 157, 163, 169, 175: Should be
\``bash` for command examples- Line 36, 50, 68, 87: Should be
\``bash` for directory structure and commands- Line 189, 195, 202: Should be
\``` (plain text) for error messagesAlso applies to: 36-36, 50-50, 68-68, 87-87, 133-133, 139-139, 145-145, 151-151, 157-157, 163-163, 169-169, 175-175, 189-189, 195-195, 202-202
plugins/must-gather/README.md (1)
26-26: Specify language for bash code blocks.Multiple code blocks throughout the file lack the
bashlanguage specifier for shell commands. Add ```bash to lines: 26, 27, 47, 62, 84, 101, 114, 164, 189, 211, 234, 245, 252.Also applies to: 27-27, 47-47, 62-62, 84-84, 101-101, 114-114, 164-164, 189-189, 211-211, 234-234, 245-245, 252-252
plugins/jira/commands/create-release-note.md (1)
10-12: Add fenced-code languages for lint compliance.
markdownlint(MD040) is flagging the plain triple-backtick blocks—starting here and repeating throughout the doc. Please add appropriate language hints (e.g.,```bash,```json,```text) so the documentation passes lint and renders with highlighting.
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Cache: Disabled due to data retention organization setting
Knowledge base: Disabled due to data retention organization setting
📒 Files selected for processing (20)
.coderabbit.yaml(1 hunks)AGENTS.md(3 hunks)PLUGINS.md(4 hunks)README.md(1 hunks)docs/data.json(7 hunks)docs/index.html(10 hunks)plugins/ci/commands/add-debug-wait.md(1 hunks)plugins/ci/commands/list-unstable-tests.md(1 hunks)plugins/ci/commands/query-test-result.md(1 hunks)plugins/jira/README.md(2 hunks)plugins/jira/commands/create-release-note.md(1 hunks)plugins/jira/skills/create-release-note/SKILL.md(1 hunks)plugins/must-gather/README.md(4 hunks)plugins/must-gather/commands/analyze.md(6 hunks)plugins/must-gather/commands/ovn-dbs.md(1 hunks)plugins/must-gather/skills/must-gather-analyzer/scripts/analyze_ovn_dbs.py(1 hunks)plugins/openshift/commands/cluster-health-check.md(1 hunks)plugins/openshift/commands/create-cluster.md(3 hunks)plugins/openshift/commands/expand-test-case.md(1 hunks)plugins/openshift/commands/review-test-cases.md(1 hunks)
🧰 Additional context used
🪛 LanguageTool
plugins/jira/commands/create-release-note.md
[style] ~194-~194: The double modal “Required Known” is nonstandard (only accepted in certain dialects). Consider “to be Known”.
Context: ...GS) - Release Note Not Required - Known Issue - Enhancement - Rebase -...
(NEEDS_FIXED)
[style] ~509-~509: The double modal “Requires read” is nonstandard (only accepted in certain dialects). Consider “to be read”.
Context: ...d) for setup instructions - Requires read/write permissions for bugs 2. **GitHub...
(NEEDS_FIXED)
plugins/ci/commands/add-debug-wait.md
[grammar] ~305-~305: Use a hyphen to join words.
Context: ...hours) 2. With custom timeout (user provided timeout parameter): ```yaml ...
(QB_NEW_EN_HYPHEN)
[grammar] ~342-~342: Use a hyphen to join words.
Context: ...hours) 2. With custom timeout (user provided timeout parameter): ```yaml ...
(QB_NEW_EN_HYPHEN)
[style] ~794-~794: ‘by mistake’ might be wordy. Consider a shorter alternative.
Context: ...pr` - Revert a debug PR that was merged by mistake
(EN_WORDINESS_PREMIUM_BY_MISTAKE)
plugins/ci/commands/query-test-result.md
[uncategorized] ~117-~117: Did you mean the formatting language “Markdown” (= proper noun)?
Context: ...ith proper spacing - Present URLs as markdown links for easy clicking ## Return Valu...
(MARKDOWN_NNP)
[uncategorized] ~133-~133: Did you mean the formatting language “Markdown” (= proper noun)?
Context: ...(brief name) - Clickable Prow URL (as markdown link or plain URL) - Failed Prow URLs s...
(MARKDOWN_NNP)
plugins/jira/skills/create-release-note/SKILL.md
[style] ~560-~560: The double modal “Required Known” is nonstandard (only accepted in certain dialects). Consider “to be Known”.
Context: ...Bug Fix 2. Release Note Not Required 3. Known Issue 4. Enhancement 5. Rebase 6. Techn...
(NEEDS_FIXED)
[style] ~582-~582: Consider using a different verb for a more formal wording.
Context: ...wn issues**: - If PRs don't actually fix the issue, just document it → Suggest "...
(FIX_RESOLVE)
plugins/openshift/commands/cluster-health-check.md
[style] ~538-~538: This phrase is redundant. Consider writing “point” or “time”.
Context: ...- The command checks cluster state at a point in time; transient issues may not be detected -...
(MOMENT_IN_TIME)
plugins/openshift/commands/expand-test-case.md
[uncategorized] ~54-~54: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ... memory, disk pressure, network issues, rate limiting - Concurrency: Multiple operations ...
(EN_COMPOUND_ADJECTIVE_INTERNAL)
🪛 markdownlint-cli2 (0.18.1)
plugins/openshift/commands/review-test-cases.md
10-10: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
51-51: Bare URL used
(MD034, no-bare-urls)
plugins/must-gather/commands/ovn-dbs.md
10-10: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
36-36: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
50-50: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
87-87: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
133-133: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
139-139: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
145-145: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
151-151: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
157-157: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
163-163: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
169-169: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
175-175: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
189-189: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
195-195: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
202-202: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
plugins/jira/commands/create-release-note.md
31-31: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
48-48: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
56-56: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
73-73: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
126-126: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
135-135: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
153-153: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
171-171: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
209-209: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
234-234: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
250-250: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
382-382: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
393-393: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
403-403: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
421-421: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
433-433: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
444-444: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
457-457: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
473-473: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
532-532: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
plugins/must-gather/commands/analyze.md
82-82: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
plugins/ci/commands/add-debug-wait.md
10-10: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
36-36: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
43-43: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
55-55: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
64-64: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
104-104: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
115-115: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
128-128: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
147-147: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
160-160: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
171-171: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
212-212: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
224-224: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
261-261: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
273-273: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
316-316: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
353-353: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
363-363: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
591-591: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
608-608: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
609-609: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
618-618: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
619-619: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
628-628: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
629-629: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
641-641: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
642-642: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
648-648: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
649-649: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
658-658: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
687-687: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
710-710: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
742-742: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
plugins/ci/commands/list-unstable-tests.md
31-31: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
48-48: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
56-56: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
73-73: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
126-126: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
135-135: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
153-153: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
171-171: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
plugins/ci/commands/query-test-result.md
10-10: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
139-139: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
154-154: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
161-161: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
168-168: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
175-175: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
182-182: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
191-191: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
245-245: Bare URL used
(MD034, no-bare-urls)
246-246: Bare URL used
(MD034, no-bare-urls)
247-247: Bare URL used
(MD034, no-bare-urls)
plugins/jira/README.md
204-204: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
219-219: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
plugins/jira/skills/create-release-note/SKILL.md
31-31: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
48-48: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
56-56: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
73-73: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
126-126: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
135-135: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
153-153: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
171-171: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
209-209: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
234-234: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
250-250: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
382-382: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
393-393: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
403-403: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
421-421: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
433-433: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
444-444: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
457-457: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
473-473: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
532-532: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
588-588: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
621-621: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
638-638: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
652-652: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
661-661: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
671-671: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
689-689: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
708-708: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
740-740: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
765-765: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
plugins/must-gather/README.md
126-126: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
234-234: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
245-245: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
252-252: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
plugins/openshift/commands/cluster-health-check.md
10-10: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
30-30: Bare URL used
(MD034, no-bare-urls)
31-31: Bare URL used
(MD034, no-bare-urls)
422-422: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
427-427: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
455-455: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
460-460: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
532-532: Bare URL used
(MD034, no-bare-urls)
533-533: Bare URL used
(MD034, no-bare-urls)
plugins/openshift/commands/expand-test-case.md
10-10: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
59-59: Bare URL used
(MD034, no-bare-urls)
60-60: Bare URL used
(MD034, no-bare-urls)
61-61: Bare URL used
(MD034, no-bare-urls)
62-62: Bare URL used
(MD034, no-bare-urls)
🪛 Ruff (0.14.3)
plugins/must-gather/skills/must-gather-analyzer/scripts/analyze_ovn_dbs.py
29-29: PEP 484 prohibits implicit Optional
Convert to T | None
(RUF013)
35-35: PEP 484 prohibits implicit Optional
Convert to T | None
(RUF013)
35-35: PEP 484 prohibits implicit Optional
Convert to T | None
(RUF013)
52-52: subprocess call: check for execution of untrusted input
(S603)
53-53: Starting a process with a partial executable path
(S607)
66-66: Do not catch blind exception: Exception
(BLE001)
99-99: Do not catch blind exception: Exception
(BLE001)
119-119: Uses of tarfile.extractall()
(S202)
315-315: f-string without any placeholders
Remove extraneous f prefix
(F541)
331-331: subprocess call: check for execution of untrusted input
(S603)
332-332: Starting a process with a partial executable path
(S607)
350-350: Do not catch blind exception: Exception
(BLE001)
356-356: PEP 484 prohibits implicit Optional
Convert to T | None
(RUF013)
380-380: f-string without any placeholders
Remove extraneous f prefix
(F541)
431-431: Starting a process with a partial executable path
(S607)
🔇 Additional comments (8)
README.md (1)
99-118: Ethical guidelines well-integrated into plugin development guidance.The Ethical Guidelines section is clearly written with strong rationale and concrete examples. The placement under Plugin Development is appropriate and the provided examples effectively demonstrate how to describe qualities explicitly.
AGENTS.md (1)
290-330: Ethical guidelines consistently integrated into agent workflows.The ethics section is well-aligned with README.md guidance and appropriately integrated into both command implementation (line 321) and SKILL.md writing (line 330) procedural checklists. Placement in the "Best Practices for AI Agents" section provides clear expectations for developers.
.coderabbit.yaml (1)
1-104: CodeRabbit configuration is well-structured and strategically focused.The configuration enforces four critical policies (real-person references, git safety, MCP security, assumed git remotes) that align with the PR's ethical and security objectives. All checks are set to error mode, which is appropriate for foundational policies.
docs/index.html (4)
44-53: Fixed navbar implementation improves discoverability.The fixed navbar with search, stats, and navigation links enhances the marketplace experience. Proper z-index layering (1000) ensures correct stacking context above content and modals.
160-266: Autocomplete dropdown provides excellent search UX.The autocomplete implementation with sectioned results (Plugins, Commands, Skills), keyboard-friendly design, and hover states significantly improves searchability. The empty-state message is user-friendly and the CSS styling is consistent with the existing design system.
475-519: Responsive design breakpoints handle multiple viewports effectively.The media queries at 968px and 480px adapt the navbar layout and grid appropriately for tablets and mobile devices. Flexbox reflow handles stat label visibility and navigation link wrapping gracefully.
921-982: Search algorithm efficiently filters across plugins, commands, and skills.The
searchAndShowAutocomplete()function performs case-insensitive substring matching across multiple fields and aggregates results by type. The filtered plugin set maintains the full UI rendering while autocomplete shows detailed matches—good UX pattern.plugins/jira/README.md (1)
184-236: Release note feature well-documented with clear workflow and examples.The new
/jira:create-release-notecommand documentation is thorough, following the established pattern from other Jira commands. The Release Note Format and Example Output sections provide clear guidance on expected behavior and output structure. Prerequisites are explicit about required tools and permissions.
| with tarfile.open(tarball, 'r:gz') as tar: | ||
| tar.extractall(path=network_logs) | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Harden tar extraction against path traversal.
tar.extractall() runs on untrusted must-gather archives without any member validation. Python’s own docs warn that extraction can write outside network_logs, and recent tarfile CVEs show that even the newer filters (filter="data") can be bypassed.(docs.python.org) Please defensively check each member before extraction (reject absolute/.. paths and symlinks that escape the target) or use a hardened extractor.
Suggested patch:
@@
- with tarfile.open(tarball, 'r:gz') as tar:
- tar.extractall(path=network_logs)
+ with tarfile.open(tarball, 'r:gz') as tar:
+ safe_base = network_logs.resolve()
+ members = []
+ for member in tar.getmembers():
+ target_path = (safe_base / member.name).resolve()
+ if not str(target_path).startswith(str(safe_base) + os.sep):
+ raise ValueError(f"Refusing to extract {member.name}: escapes {safe_base}")
+ if member.islnk() or member.issym():
+ raise ValueError(f"Refusing to extract link {member.name}: unsafe for analysis")
+ members.append(member)
+ tar.extractall(path=safe_base, members=members)(Feel free to factor the safety checks into a helper for reuse.)
Committable suggestion skipped: line range outside the PR's diff.
🧰 Tools
🪛 Ruff (0.14.3)
119-119: Uses of tarfile.extractall()
(S202)
| echo "Creating service account: $SERVICE_ACCOUNT_NAME" | ||
| gcloud iam service-accounts create "$SERVICE_ACCOUNT_NAME" --display-name="$SERVICE_ACCOUNT_NAME" | ||
| ``` | ||
|
|
||
| 5. **Extract service account details**: | ||
| ```bash | ||
| # Get service account information | ||
| SERVICE_ACCOUNT_JSON="$(gcloud iam service-accounts list --format json | jq -r '.[] | select(.name | match("/\(env.SERVICE_ACCOUNT_NAME)@"))')" | ||
| SERVICE_ACCOUNT_EMAIL="$(jq -r .email <<< "$SERVICE_ACCOUNT_JSON")" | ||
| PROJECT_ID="$(jq -r .projectId <<< "$SERVICE_ACCOUNT_JSON")" | ||
|
|
||
| echo "Service Account Email: $SERVICE_ACCOUNT_EMAIL" | ||
| echo "Project ID: $PROJECT_ID" | ||
| ``` | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add error handling for service account creation and validation.
The script creates a service account but doesn't verify success before attempting to extract its details. Additionally, there's no handling if a service account with that name already exists, and no validation that the user has IAM permissions to create service accounts.
Add validation after service account creation and before extraction:
echo "Creating service account: $SERVICE_ACCOUNT_NAME"
gcloud iam service-accounts create "$SERVICE_ACCOUNT_NAME" --display-name="$SERVICE_ACCOUNT_NAME"
+ if [ $? -ne 0 ]; then
+ echo "Error: Failed to create service account. Check that you have 'iam.serviceAccountAdmin' role."
+ exit 1
+ fi
- # Get service account information
- SERVICE_ACCOUNT_JSON="$(gcloud iam service-accounts list --format json | jq -r '.[] | select(.name | match("/\(env.SERVICE_ACCOUNT_NAME)@"))')"
+ # Get service account information
+ SERVICE_ACCOUNT_JSON="$(gcloud iam service-accounts list --format json | jq -r --arg account "$SERVICE_ACCOUNT_NAME" '.[] | select(.email | contains($account))')"
+ if [ -z "$SERVICE_ACCOUNT_JSON" ]; then
+ echo "Error: Service account was created but could not be found in listing."
+ exit 1
+ fi📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| echo "Creating service account: $SERVICE_ACCOUNT_NAME" | |
| gcloud iam service-accounts create "$SERVICE_ACCOUNT_NAME" --display-name="$SERVICE_ACCOUNT_NAME" | |
| ``` | |
| 5. **Extract service account details**: | |
| ```bash | |
| # Get service account information | |
| SERVICE_ACCOUNT_JSON="$(gcloud iam service-accounts list --format json | jq -r '.[] | select(.name | match("/\(env.SERVICE_ACCOUNT_NAME)@"))')" | |
| SERVICE_ACCOUNT_EMAIL="$(jq -r .email <<< "$SERVICE_ACCOUNT_JSON")" | |
| PROJECT_ID="$(jq -r .projectId <<< "$SERVICE_ACCOUNT_JSON")" | |
| echo "Service Account Email: $SERVICE_ACCOUNT_EMAIL" | |
| echo "Project ID: $PROJECT_ID" | |
| ``` | |
| echo "Creating service account: $SERVICE_ACCOUNT_NAME" | |
| gcloud iam service-accounts create "$SERVICE_ACCOUNT_NAME" --display-name="$SERVICE_ACCOUNT_NAME" | |
| if [ $? -ne 0 ]; then | |
| echo "Error: Failed to create service account. Check that you have 'iam.serviceAccountAdmin' role." | |
| exit 1 | |
| fi | |
| 5. **Extract service account details**: |
🤖 Prompt for AI Agents
In plugins/openshift/commands/create-cluster.md around lines 309 to 323, the
script creates a service account but does not verify success, handle "already
exists" cases, or validate IAM permissions before trying to read its details;
update the flow to check the exit status of the gcloud create command and fail
fast with a clear error if it returns non-zero, detect and treat an existing
service account as an acceptable state (skip creation and continue) by querying
for the specific service account email/name rather than listing all accounts,
validate the current user has iam.serviceAccounts.create (or equivalent)
permission before creating (and error out with guidance if missing), and only
proceed to extract SERVICE_ACCOUNT_JSON, SERVICE_ACCOUNT_EMAIL, and PROJECT_ID
after confirming the service account exists (and otherwise exit with a
descriptive error).
| SERVICE_ACCOUNT_JSON="$(gcloud iam service-accounts list --format json | jq -r '.[] | select(.name | match("/\(env.SERVICE_ACCOUNT_NAME)@"))')" | ||
| SERVICE_ACCOUNT_EMAIL="$(jq -r .email <<< "$SERVICE_ACCOUNT_JSON")" | ||
| PROJECT_ID="$(jq -r .projectId <<< "$SERVICE_ACCOUNT_JSON")" | ||
|
|
||
| echo "Service Account Email: $SERVICE_ACCOUNT_EMAIL" | ||
| echo "Project ID: $PROJECT_ID" | ||
| ``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix jq syntax error in service account extraction.
The jq filter on line 316 uses invalid interpolation syntax. The expression match("/\(env.SERVICE_ACCOUNT_NAME)@") is not valid jq; the \(env.SERVICE_ACCOUNT_NAME) pattern won't interpolate the shell variable. Additionally, gcloud iam service-accounts list output uses .email (not .name) for the account email.
Apply this fix:
- SERVICE_ACCOUNT_JSON="$(gcloud iam service-accounts list --format json | jq -r '.[] | select(.name | match("/\(env.SERVICE_ACCOUNT_NAME)@"))')"
- SERVICE_ACCOUNT_EMAIL="$(jq -r .email <<< "$SERVICE_ACCOUNT_JSON")"
- PROJECT_ID="$(jq -r .projectId <<< "$SERVICE_ACCOUNT_JSON")"
+ SERVICE_ACCOUNT_JSON="$(gcloud iam service-accounts list --format json | jq -r --arg account "$SERVICE_ACCOUNT_NAME" '.[] | select(.email | contains($account))')"
+ SERVICE_ACCOUNT_EMAIL="$(jq -r .email <<< "$SERVICE_ACCOUNT_JSON")"
+ PROJECT_ID="$(gcloud config get-value project)"Note: gcloud config get-value project is the standard way to retrieve the project ID; it's simpler than extracting from service account JSON.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| SERVICE_ACCOUNT_JSON="$(gcloud iam service-accounts list --format json | jq -r '.[] | select(.name | match("/\(env.SERVICE_ACCOUNT_NAME)@"))')" | |
| SERVICE_ACCOUNT_EMAIL="$(jq -r .email <<< "$SERVICE_ACCOUNT_JSON")" | |
| PROJECT_ID="$(jq -r .projectId <<< "$SERVICE_ACCOUNT_JSON")" | |
| echo "Service Account Email: $SERVICE_ACCOUNT_EMAIL" | |
| echo "Project ID: $PROJECT_ID" | |
| ``` | |
| SERVICE_ACCOUNT_JSON="$(gcloud iam service-accounts list --format json | jq -r --arg account "$SERVICE_ACCOUNT_NAME" '.[] | select(.email | contains($account))')" | |
| SERVICE_ACCOUNT_EMAIL="$(jq -r .email <<< "$SERVICE_ACCOUNT_JSON")" | |
| PROJECT_ID="$(gcloud config get-value project)" | |
| echo "Service Account Email: $SERVICE_ACCOUNT_EMAIL" | |
| echo "Project ID: $PROJECT_ID" |
🤖 Prompt for AI Agents
plugins/openshift/commands/create-cluster.md lines 316-322: the jq filter uses
invalid interpolation and checks .name instead of .email; replace the extraction
so jq matches on the service account email (not .name) and pass the shell
variable into jq properly (use jq --arg or env var support) to select the
correct object by .email, then extract .email and .projectId from that object;
also simplify PROJECT_ID by using gcloud config get-value project instead of
parsing the service account JSON.
| while IFS= read -r ROLE_TO_ADD ; do | ||
| echo "Adding role: $ROLE_TO_ADD" | ||
| gcloud projects add-iam-policy-binding "$PROJECT_ID" \ | ||
| --condition="None" \ | ||
| --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \ | ||
| --role="$ROLE_TO_ADD" | ||
| done << 'END_OF_ROLES' | ||
| roles/compute.admin | ||
| roles/iam.securityAdmin | ||
| roles/iam.serviceAccountAdmin | ||
| roles/iam.serviceAccountKeyAdmin | ||
| roles/iam.serviceAccountUser | ||
| roles/storage.admin | ||
| roles/dns.admin | ||
| roles/compute.loadBalancerAdmin | ||
| roles/iam.roleAdmin | ||
| END_OF_ROLES |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add error handling for IAM role assignment loop.
The role-assignment loop lacks error handling. If a role assignment fails (e.g., due to insufficient permissions or invalid role), the script continues silently without reporting the failure.
Add error checking within the role assignment loop:
while IFS= read -r ROLE_TO_ADD ; do
echo "Adding role: $ROLE_TO_ADD"
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--condition="None" \
--member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
--role="$ROLE_TO_ADD"
+ if [ $? -ne 0 ]; then
+ echo "Warning: Failed to add role $ROLE_TO_ADD. This may cause installation to fail later."
+ fi
done << 'END_OF_ROLES'Alternatively, if any role failure should be fatal, exit immediately with || exit 1.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| while IFS= read -r ROLE_TO_ADD ; do | |
| echo "Adding role: $ROLE_TO_ADD" | |
| gcloud projects add-iam-policy-binding "$PROJECT_ID" \ | |
| --condition="None" \ | |
| --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \ | |
| --role="$ROLE_TO_ADD" | |
| done << 'END_OF_ROLES' | |
| roles/compute.admin | |
| roles/iam.securityAdmin | |
| roles/iam.serviceAccountAdmin | |
| roles/iam.serviceAccountKeyAdmin | |
| roles/iam.serviceAccountUser | |
| roles/storage.admin | |
| roles/dns.admin | |
| roles/compute.loadBalancerAdmin | |
| roles/iam.roleAdmin | |
| END_OF_ROLES | |
| while IFS= read -r ROLE_TO_ADD ; do | |
| echo "Adding role: $ROLE_TO_ADD" | |
| gcloud projects add-iam-policy-binding "$PROJECT_ID" \ | |
| --condition="None" \ | |
| --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \ | |
| --role="$ROLE_TO_ADD" | |
| if [ $? -ne 0 ]; then | |
| echo "Warning: Failed to add role $ROLE_TO_ADD. This may cause installation to fail later." | |
| fi | |
| done << 'END_OF_ROLES' | |
| roles/compute.admin | |
| roles/iam.securityAdmin | |
| roles/iam.serviceAccountAdmin | |
| roles/iam.serviceAccountKeyAdmin | |
| roles/iam.serviceAccountUser | |
| roles/storage.admin | |
| roles/dns.admin | |
| roles/compute.loadBalancerAdmin | |
| roles/iam.roleAdmin | |
| END_OF_ROLES |
🤖 Prompt for AI Agents
In plugins/openshift/commands/create-cluster.md around lines 328 to 344, the IAM
role-assignment loop currently ignores failures; update the loop to check each
gcloud command's exit status, log a clear error message including the role and
exit code/message on failure, and either continue with a non-zero exit indicator
or abort immediately (e.g., exit 1) depending on desired behavior; ensure the
script captures and surfaces gcloud stderr for diagnostics and use a conditional
(if/then) or || handler after the gcloud invocation to implement the chosen
failure policy.
|
I can remove the massive commit history - the rebase via CLI didn't work, so I resolved via the GH Web UI. |
|
Closing as unclean commit history. Clean PR here --> #130 . |
Summary
/jira:backlogcommand to help developers find suitable JIRA tickets from the backlog to work onKey Features
Smart Filtering:
Intelligent Analysis:
Performance:
Comprehensive Documentation:
Command Syntax
Examples
Test plan
make lintto validate plugin structure🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
/jira:backlogcommand to discover backlog items filtered by project, assignee, and inactivity status./jira:create-release-notecommand to automatically generate release notes from Jira issues and linked pull requests.Documentation